// 给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为更加简洁的规范路径。

// 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/' 。 对于此问题，任何其他格式的点（例如，'...'）均被视为文件/目录名称。

// 请注意，返回的 规范路径 必须遵循下述格式：

// 始终以斜杠 '/' 开头。
// 两个目录名之间必须只有一个斜杠 '/' 。
// 最后一个目录名（如果存在）不能 以 '/' 结尾。
// 此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
// 返回简化后得到的 规范路径 。


/**
 * @param {string} path
 * @return {string}
 */
// 运行成功
var simplifyPath = function(path) {
    path = path.split("");
    if (path[path.length - 1] != '/') { path.push('/') }
    let arr = [];
    let stk = [];
    let str = '';
    // 先对数组进行处理,将其转变为/与文件名/特殊符号的形式
    for (let i = 0; i < path.length; i++) {
        if (path[i] == '/') {
            if (str != '') { //注意文件名是多个字符,需要先保存再一并 加入
                arr.push(str);
                str = '';
            }
            continue;
        } else {
            str += path[i];
        }
    }
    console.log(arr)
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] != "." && arr[i] != '..') {
            stk.push(arr[i]); //不等于特殊符号默认文件名,直接进栈
        } else if (arr[i] == ".") {
            continue; //遇到'./'同级文件,跳过
        }
        if (arr[i] == '..' && stk != []) {
            stk.pop(); //遇到../出栈,注意判断非空条件
        }
    }
    // 最后加入/并对边界条件做一些处理
    let las = stk.join("/").split("");
    if (las[0] != '/') { las.unshift("/") }
    return las.join("")
};

//简化代码：
// 直接用'/'处理,无需第一次遍历
const dir = path.split('/'),
    stack = []
for (const i of dir) {
    // 特殊情况直接跳过
    if (i === '.' || i === '') continue
        // 遇到'..'入栈
    if (i === '..') {
        stack.length > 0 ? stack.pop() : null
        continue
    }
    //其他情况直接进栈
    stack.push(i)
}
// 直接在return处处理结果
return '/' + stack.join('/')